#include "chatuserlist.h"

ChatUserList::ChatUserList(QWidget *parent)
    : QListWidget(parent)
{
    // 将滚动条设置为隐藏状态
    this->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
    this->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);

    // 安装事件过滤器，监听滚轮事件
    this->viewport()->installEventFilter(this);
}


bool ChatUserList::eventFilter(QObject *obj, QEvent *e)
{
    // 判断事件来源是否为视口区域
    if(obj == this->viewport()) 
    {
        // 当鼠标进入窗口时，才会显示滚动条，鼠标离开窗口时隐藏滚动条
        if (e->type() == QEvent::Enter) 
        {
            this->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);
        } 
        else if (e->type() == QEvent::Leave) 
        {
            this->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
        }

        // 监听滚轮事件
        if (e->type() == QEvent::Wheel) 
        {
            // 将通用事件对象QEvent*强制转换为滚轮事件专用对象QWheelEvent*
            QWheelEvent *wheel = static_cast<QWheelEvent *>(e);
            // 将原始角度值（通常为120的倍数）转换为更易处理的数值
            int numDegrees = wheel->angleDelta().y() / 8;
            int numSteps = numDegrees / 15; // 每15度为一个步进
            // 获取垂直滚动条对象 设置滚动条当前值
            this->verticalScrollBar()->setValue(this->verticalScrollBar()->value() - numSteps);
        
            // 如果滚动条已经滚动到最底部，则发送加载更多用户信号
            if (this->verticalScrollBar()->value() == this->verticalScrollBar()->maximum()) 
            {
                emit sig_loading_chat_user();
            }
        }

        return true;
    }
    
    // 其他事件继续传递给父类处理
    return QListWidget::eventFilter(obj, e);
}
